/* eslint-disable no-use-before-define */
import { DeviceDTO } from '@/api/entity/device'
import { ObjectUtil } from '@utils/object-util'

// region TODO 表单

export class VariableModelSaveForm {
  constructor (option?: Record<string, any>) {
    option && ObjectUtil.updateVal(this, option)
    if (!this.vbVariableDTOS) this.vbVariableDTOS = []
    if (!this.variableIds) this.variableIds = []
  }

  id?: string
  // 模板名称
  modelName?: string
  // 变量
  vbVariableDTOS: VariableSaveForm[] = []
  // 变量ids，作用于变量配置-删除变量id的存储
  variableIds: string[] = []
}

export class VariableSaveForm {
  constructor (option?: Record<string, any>) {
    option && Object.assign(this, option)
  }

  // 主键id
  id?: string
  // 变量地址
  address?: string
  // 是否控制 0-不控制 1-控制
  control?: string = '0'
  // 小数位
  decimal?: number = 1
  // 数据修正
  formula?: string
  // 代表状态 (json)
  indicatesStatus?: IndicatesStatusItem[] = []
  // 变量名称
  name?: string
  // 是否展示 0-不展示 1-展示
  show?: string = '1'
  // 是否存储 0-不存储 1-存储
  storage?: string = '0'
  // 变量类型 0-模拟量 1-开关量
  type?: string = '0'
  // 变量单位
  unit?: string
  // 读取最大值（最大有效值）
  readMax?: number
  // 读取最小值（最小有效值）
  readMin?: number
  // 写入最大值
  writeMax?: number
  // 写入最小值
  writeMin?: number
  // 写数据修正
  writeFormula?: string
  // 数据类型 0-普通变量 1-差值变量 2-计算变量
  dataType?: string = '0'
  // 计算类型 0-周期 1-实时
  computeType?: string
  // 周期频率 0-日 1-周 2-月
  cycleFrequency?: string
  // 引用变量地址
  parentAddress?: string
  // 计算变量的存储 Key:标识（A），Value:变量地址（4x0001）
  interior?: Record<string, string> = {}
  // 是否复位 0-否 2-是
  reset?: string = '0'
  // 复位时间（秒）
  resetTime?: number
  // 复位指令
  resetCommand?: string
}

// 代表状态项
export interface IndicatesStatusItem {
  // 例： 关 / 开
  statusValue?: string,
  // 例： 0 / 1
  statusName?: number,
  // 颜色
  colour?: string
}
// endregion

export type VariableStatusDTO = IndicatesStatusItem

export interface VariableDTO {
  // 变量地址
  address?: string
  // 是否控制
  control?: string
  // 创建时间
  createdAt?: string
  // 创建人
  createdBy?: string
  // 小数位
  decimal?: number
  // 设备id
  deviceId?: string
  // 数据修正
  formula?: string
  // 主键id
  id?: string
  // ids
  ids?: string[]
  // 代表状态
  indicatesStatus?: VariableStatusDTO[]
  // 变量名称
  name?: string
  // 是否展示
  show?: string
  // 排序
  sort?: number
  // 是否存储
  storage?: string
  // 变量类型 0-模拟量 1-开关量
  type?: string
  // 变量单位
  unit?: string
  // 变量值
  value?: string
  // 读取最大值
  readMax?: number
  // 读取最小值
  readMin?: number
  // 写入最大值
  writeMax?: number
  // 写入最小值
  writeMin?: number
  // 数据类型 0-普通变量 1-差值变量 2-计算变量
  dataType?: string
  // 计算类型 0-周期 1-实时
  computeType?: string
  // 周期频率 0-日 1-周 2-月
  cycleFrequency?: string
  // 引用变量地址
  parentAddress?: string
  // 计算变量的存储 Key:标识（A），Value:变量地址（4x0001）
  interior?: Record<string, string>
  // 是否复位 0-否 2-是
  reset?: string
  // 复位时间（秒）
  resetTime?: number
  // 复位指令
  resetCommand?: string
}

export interface VbTemplate {
  // 创建时间
  createdAt?: string
  // 创建人
  createdBy?: number
  // id
  id?: string
  // 模板名称
  modelName: string
  // 变量数
  variableCount?: number
  // 设备
  deviceDTOList?: DeviceDTO[]
  // 变量
  vbVariableDTOS?: VariableDTO[]
}

export interface Template {
  // 创建时间
  createdAt?: string
  // 创建人
  createdBy?: number
  // 删除标志（0代表存在 2代表删除）
  delFlag?: string
  // id
  id?: string
  // 模板名称
  modelName?: string
  // 更新时间
  updatedAt?: string
  // 更新人
  updatedBy?: number
  // 变量数
  variableCount?: number
}

export interface VariableVO {
  // 变量地址
  address?: string
  // 设备id
  deviceId?: string
  // 代表状态
  indicatesStatus?: VariableStatusDTO[]
  // 变量名称
  name?: string
  // 时间
  ts?: string
  // 变量类型 0-模拟量 1-开关量
  type?: string
  // 变量单位
  unit?: string
  // 变量值
  value?: string
  // 变量Id
  variableId?: string
}
